package com.xiaozheng.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Package: com.xiaozheng.proxy
 * @ClassName: Client
 * @Author: 小政同学    QQ:xiaozheng666888@qq.com
 * @CreateTime: 2020/9/27 17:20
 * @What_is_this_file_for: 模拟一个消费者
 * @Description: 描述
 */
public class Client {
    public static void main(String[] args) {
        final ProducerImpl producerImpl = new ProducerImpl();
        ProducerImpl cglibproducerImpl = (ProducerImpl) Enhancer.create(producerImpl.getClass(), new MethodInterceptor() {
            /**
             * 执行被代理对象的任何方法都会经过该方法
             * @param o 代理对象的引用
             * @param method 当前执行的方法
             * @param objects 当前执行的方法所需的参数
             * @param methodProxy 当前执行方法的代理对象
             * @return 和被代理对象有相同的返回值
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                //提供增强的代码
                Object retuenValue = null;
                //1.获取方法执行的参数
                Float money = (Float) objects[0];
                //2.判断当前方法是否为销售
                if ("saleProducer".equals(method.getName())){
                    retuenValue = method.invoke(producerImpl, money*0.8F);
                    /**
                     * 参数：指谁的方法,(指被代理对象的方法)
                     *      谁：producerImpl
                     *      方法：money*0.8F
                     *      注：匿名内部类访问外部成员变量是，外部成员要求为final修饰
                     */
                }
                if ("afterService".equals(method.getName())){
                    retuenValue = method.invoke(producerImpl, money*0.6F);
                    /**
                     * 参数：指谁的方法,(指被代理对象的方法)
                     *      谁：producerImpl
                     *      方法：money*0.8F
                     *      注：匿名内部类访问外部成员变量是，外部成员要求为final修饰
                     */
                }
                return retuenValue;
            }
        });
        cglibproducerImpl.saleProducer(12000f);
        cglibproducerImpl.afterService(1200f);
    }
}
